/*
 * Assemble.h
 *
 *  Created on: 1 Aug 2011
 *      Author: Allan
 */

#ifndef ASSEMBLE_H_
#define ASSEMBLE_H_

// C++ includes
#include <vector>
#include <string>
using namespace std;

// GeoReact forward declarations
class Phase;
class Multiphase;
class Reaction;
class ReactionSystem;

///====================================================================================================///
/// Methods for assemblage of phases
///====================================================================================================///
const Multiphase
AssembleMultiphase(const vector<string>& allSpecies);

///====================================================================================================///
/// Methods for assemblage of reactions
///====================================================================================================///
const ReactionSystem
AssembleReactionSystem(const vector<string>& species);

const Reaction 
AssembleReaction(const string& species);

const Reaction 
AssemblePlainReaction(const string& species);

const Reaction 
AssembleBasisReaction(const string& species);

const Reaction 
AssembleMineralReaction(const string& species);

///====================================================================================================///
/// Methods for assemblage of species
///====================================================================================================///
const vector<string>
AssembleSpecies(const vector<string>& knownSpecies);

const vector<string>
AssembleSpecies(const vector<string>& knownSpecies, const vector<string>& tagsSecondarySpecies);

const vector<string>
AssembleBasisSpecies(const vector<string>& knownSpecies);

const vector<string>
AssembleSecondarySpecies(const vector<string>& knownSpecies);

const vector<string>
AssembleSecondaryAqueousSpecies(const vector<string>& knownSpecies);

///====================================================================================================///
/// Auxiliary methods
///====================================================================================================///
const vector<string>
FilterSpecies(const vector<string>& species, const vector<string>& tags);

const vector<string>
RemoveSpecies(const vector<string>& species, const vector<string>& tags);

#endif /* ASSEMBLE_H_ */
